package com.hmall.item.controller;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hmall.common.domain.PageDTO;
import com.hmall.item.domain.dto.ItemDTO;
import com.hmall.item.domain.po.Item;
import com.hmall.item.domain.query.ItemPageQuery;
import com.hmall.item.service.IItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 商品搜索控制器
 * 提供基于数据库的商品搜索功能，支持多条件筛选和分页查询
 */
@Api(tags = "搜索相关接口")
@RestController
@RequestMapping("/search")
@RequiredArgsConstructor
public class SearchController {

    private final IItemService itemService;

    /**
     * 搜索商品接口
     * @param query 搜索条件封装对象，包含关键词key、种类category、品牌brand、最小价格minPrice、最大价格maxPrice
     * @return 分页包装的商品DTO列表
     */
    @ApiOperation("搜索商品")
    @GetMapping("/list")
    public PageDTO<ItemDTO> search(ItemPageQuery query) {

        // 构建分页查询条件
        Page<Item> result = itemService.lambdaQuery()
                // 1. 商品名称模糊匹配（仅当关键字不为空时生效）
                .like(StrUtil.isNotBlank(query.getKey()), Item::getName, query.getKey())
                // 2. 品牌精确匹配（仅当品牌参数不为空时生效）
                .eq(StrUtil.isNotBlank(query.getBrand()), Item::getBrand, query.getBrand())
                // 3. 分类精确匹配（仅当分类参数不为空时生效）
                .eq(StrUtil.isNotBlank(query.getCategory()), Item::getCategory, query.getCategory())
                // 4. 仅查询状态为1（正常）的商品
                .eq(Item::getStatus, 1)
                // 5. 价格区间查询（仅当最大价格不为空时生效）
                .between(query.getMaxPrice() != null, Item::getPrice,
                        query.getMinPrice() != null ? query.getMinPrice() : 0,
                        query.getMaxPrice())
                // 6. 分页并按更新时间倒序排序
                .page(query.toMpPage("update_time", false));

        // 将分页结果中的实体列表转换为DTO列表，并封装到统一的分页DTO中返回
        return PageDTO.of(result, ItemDTO.class);
    }
}